package com.zxjbyte.yiyi.framework.common.core.pdf.event;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.zxjbyte.yiyi.framework.common.core.pdf.PdfHelper;

/**
 * 多行文本水印， 默认顺时针旋转45度
 * @Author zhangxingjia
 * @Date 2023/3/24 14:55
 * @Version: 1.0
 */
public class MultilineTextWatermark extends PdfPageEventHelper {

    // 水印文本
    private final String text;
    // 字体大小
    private final float size;

    @Override
    public void onEndPage(PdfWriter writer, Document document) {
        // 设置字体、字号和颜色
        BaseFont baseFont = PdfHelper.getChineseBaseFont();
        Font font = new Font(baseFont, size, Font.NORMAL, BaseColor.LIGHT_GRAY);
        PdfContentByte canvas = writer.getDirectContent();
        // 设置水印的透明度
        PdfGState gs = new PdfGState();
        gs.setFillOpacity(0.3f);
        canvas.setGState(gs);
        // 字体宽度
        float textWidth = baseFont.getWidthPoint(text, size);
        // 行内间距
        float linePadding = textWidth * 0.5f;
        // 行高 字体宽度的1.5倍
        float lineHeight = textWidth * 1.5f;
        // 旋转角度
        float rotation = 45f;
        // 获取页面大小
        Rectangle pageRect = document.getPageSize();

        // 计算每行水印文字的起始坐标 （这里x轴坐标算法尽量考虑左右两边对称的原则，目前算法未考虑旋转角度问题）
        float xStart = (pageRect.getWidth() + (pageRect.getWidth() / (textWidth + linePadding) * linePadding)) % (textWidth + linePadding) / 2;
        float yStart = (float) (pageRect.getTop() - Math.ceil(textWidth / 2));

        Phrase phrase = new Phrase(text, font);
        // 从左上边界开始画
        for (float y = yStart; y > pageRect.getBottom(); y -= lineHeight) {
            for (float x = xStart; x < pageRect.getRight(); x += textWidth + linePadding) {
                ColumnText.showTextAligned(canvas, Element.ALIGN_LEFT, phrase, x, y, rotation);
            }
        }
    }

    public MultilineTextWatermark(String text, float size) {
        this.text = text;
        this.size = size;
    }

    public MultilineTextWatermark(String text) {
        this(text, 20f);
    }
}
